package com.example.jul.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.*;

/**
 * @author 星空 岳先生
 * @name
 * @date 2022-11-15 0:42
 */
@RestController
@RequestMapping("/jul")
public class JulController {

    @GetMapping("/demoA")
    public void demoA() {
//         1.创建JUL Logger对象无法传入class对象，只能传如："cn.xw.testDemo"
        Logger logger = Logger.getLogger(JulController.class.getName());
        // 2.输出日志的两种方式，其中日志级别共有7种，还有2种特殊级别
        logger.severe("[SEVERE 1000] 表明程序严重的失败或错误");
        logger.warning("[WARNING 900] 表明潜在的问题");
        // 带有占位符的日志打印
        String name = "蚂蚁小哥", age = "24";
        logger.log(Level.INFO, "姓名：{0} 年龄：{1}", new Object[]{name, age});
//        Logger logger = Logger.getLogger(JulApplicationTests.class.getName());
        logger.severe("severe——严重失败或错误");
        logger.warning("warning——潜在问题");
        logger.info("info——默认");
        logger.config("config——表明系统静态配置信息");
        logger.fine("fine——关注信息");
        logger.finer("finer——进出信息和异常捕捉");
        logger.finest("finest——最细信息");
    }

    @GetMapping("/demoB")
    public void demoB() throws IOException {
        //获取日志记录器
        Logger logger = Logger.getLogger(JulController.class.getName());
        //设置false；指定此记录器是否应将其输出发送到其父记录器（是否继承父记录器配置）（必须设置）
        logger.setUseParentHandlers(false);
        //创建日志格式化组件对象
        //若想自定义格式化则通过simpleFormatter.format(java.util.logging.LogRecord record)
        SimpleFormatter simpleFormatter = new SimpleFormatter();
        //创建Handler（ConsoleHandler为控制台输出处理器）
        ConsoleHandler consoleHandler = new ConsoleHandler();
        //创建文件处理器Handler  fileLog.log文件名称
        FileHandler fileHandler = new FileHandler("./fileLog.log");
        //设置处理器中的内容输出格式及输出级别
        consoleHandler.setFormatter(simpleFormatter);
        consoleHandler.setLevel(Level.CONFIG);
        fileHandler.setFormatter(simpleFormatter);
        fileHandler.setLevel(Level.CONFIG);
        //设置记录器中的处理器(控制台记录器、文件记录器)及记录器的输出级别
        logger.addHandler(consoleHandler);
        logger.addHandler(fileHandler);
        logger.setLevel(Level.CONFIG);
        //输出打印
        logger.severe("[SEVERE 1000] 表明程序严重的失败或错误");
        logger.warning("[WARNING 900] 表明潜在的问题");
        logger.info("[INFO 800] 信息级别，通过消息会被输入到控制台，所以信息级别一般记录对最终用户或系统管理员有用的信息");
        logger.config("[CONFIG 700] 配置级别，用于表明系统静态配置的信息"); //这时默认级别为 CONFIG
        logger.fine("[FINE 500] 输出开发人员关注的信息");
        logger.finer("[FINER 400] 输出进入方法或者出入方法的一些信息和异常捕捉");
        logger.finest("[FINEST 300] 输出最细的信息");
    }

    @GetMapping("/demoC")
    public void demoC() throws IOException {
        //获取LogManager，LogManager是单例对象
        LogManager logManager = LogManager.getLogManager();
        //读取配置文件，并加载应用配置文件logging.properties
        InputStream resourceAsStream = JulController.class.getClassLoader().getResourceAsStream("logging.properties");
        logManager.readConfiguration(resourceAsStream);
        //获取日志记录器
        Logger logger = Logger.getLogger("com.example.jul.controller");
        //输出打印
        logger.severe("[SEVERE 1000] 表明程序严重的失败或错误");
        logger.warning("[WARNING 900] 表明潜在的问题");
        logger.info("[INFO 800] 信息级别，通过消息会被输入到控制台，所以信息级别一般记录对最终用户或系统管理员有用的信息");
        logger.config("[CONFIG 700] 配置级别，用于表明系统静态配置的信息");
        logger.fine("[FINE 500] 输出开发人员关注的信息");
        logger.finer("[FINER 400] 输出进入方法或者出入方法的一些信息和异常捕捉");
        logger.finest("[FINEST 300] 输出最细的信息"); //这时默认级别为 ALL
        System.out.println("=============================================");
        //指定自定义日志对象的名称，配置文件中对com.anhui名称的Logger进行了特殊配置 自定义
        Logger loggerCustomize = Logger.getLogger("com.anhui");
        loggerCustomize.severe("[SEVERE 1000] 表明程序严重的失败或错误");
        loggerCustomize.warning("[WARNING 900] 表明潜在的问题");
        loggerCustomize.info("[INFO 800] 信息级别，通过消息会被输入到控制台，所以信息级别一般记录对最终用户或系统管理员有用的信息");
        loggerCustomize.config("[CONFIG 700] 配置级别，用于表明系统静态配置的信息"); //这时默认级别为 CONFIG
        loggerCustomize.fine("[FINE 500] 输出开发人员关注的信息");
        loggerCustomize.finer("[FINER 400] 输出进入方法或者出入方法的一些信息和异常捕捉");
        loggerCustomize.finest("[FINEST 300] 输出最细的信息");
    }
}
